#pragma once
#define TYPE_INT 0
#define TYPE_FLOAT 1
#define NEW_VAR 0
#define NEW_STRUCT 1
typedef struct Type_ *Type;
typedef struct Array_ *Array;
typedef struct FieldList_ *FieldList;
typedef struct Structure_ *Structure;
typedef struct Para_ *Para;
typedef struct Func_ *Func;
typedef struct Symbol_ *Symbol;
typedef struct Symtable_ *Symtable;
//类型
struct Type_
{
    enum
    {
        BASIC,
        ARRAY,
        STRUCTURE,
        NONE
    } kind;
    union
    {
        int basic;           //基本类型
        Array array;         //数组
        Structure structure; //结构体
    } u;
};

//数组
struct Array_
{
    Type elem;
    int size;
};

//结构体
struct Structure_
{
    FieldList field;
    char *name; //结构体标识
};

struct FieldList_
{
    char *name;     //域名
    Type type;      //域的类型
    FieldList tail; //下一个域
};

//参数
struct Para_
{
    Type type;
    Para tail;
};

//函数
struct Func_
{
    int paranum; //参数数量
    Type ret;
    Para para;
};

//符号
struct Symbol_
{
    enum
    {
        VAR,
        FUNC,
        STRU
    } kind;
    char *name;
    int beStru;
    union
    {
        Type var;       //变量
        Func func;      //函数
        Type structure; //结构体
    } u;
};

//符号表项
struct Symtable_
{
    Symbol sym;
    Symtable tail;
};

//哈希值计算函数
unsigned int unsignedinthash_pjw(char *name);
//查找表中符号，调用符号，不需要检查重复
Symbol lookup(char *name);
//查找符号表
int FindTable(Symbol symbol);
//比对符号是否相同
int match(Symbol sym1, Symbol sym2);
//插入符号表
void InsertToTable(Symbol symbol);
//创建基本类型
Type CreateTypeBasic(int basic);
//创建数组类型
Type CreateTypeArray(Array array);
//创建结构体类型
Type CreateTypeStructure(Structure structure);
//创建数组
Array CreateArray(Type elem, int size);
//创建结构体
Structure CreateStructure(FieldList fieldList, char *name);
//创建结构体的头结点
FieldList CreateFieldHead();
//创建结构体的域结点
void CreateFieldNode(FieldList head, char *name, Type type);
//创建参数列表的头结点
Para CreateParaHead();
//创建参数列表的参数结点
void CreateParaNode(Para head, Type type);
//创建函数
Func CreateFunc(int paramnum, Type ret, Para head);
//创建变量符号
Symbol CreateSymbolVar(char *name, Type var, int beStru);
//创建函数符号
Symbol CreateSymbolFunc(char *name, Func func);
//创建结构体符号
Symbol CreateSymbolStru(char *name, Type structure);
